#include "Intercalador.h"
#include "Indexador.h"

void intercale(char *nome1Arqu, char *nome2Arqu)
{
    char nome1[100], nome2[100], exten[] = EXTENIDX;
    char nomeF[200];

    strcpy(nome1, nome1Arqu);
    strcpy(nome2, nome2Arqu);

    //gerando os index
    gera_index(nome1Arqu);
    gera_index(nome2Arqu);

    //gerando o nome do arqui final
    strcpy(nomeF, "2_");
    strcat(nomeF, nome1);
    strcat(nomeF, "_");
    strcat(nomeF, nome2);
    strcat(nomeF, ".idx");

    //gerando os nomes dos arquis
    colocaExten(nome1, exten);
    colocaExten(nome2, exten);

    engine_inter(nome1, nome2, nomeF);
    geraArqu(nome1, nome2, nomeF);
}

void engine_inter(char *nome1Arqu, char *nome2Arqu, char *nomeF)
{
    //variveis
    char reg1[200], reg2[200], prr1[10], prr2[10], ultima[200] = "ZZZZZZZZZZZ";
    unsigned short int control = 0, tag1 = 0, tag2 = 0;
    int greg1, greg2;
    FILE *index1 = NULL, *index2 = NULL, *indexF = NULL;
    ultima[0] = 255;

    //abrindos os arquivos
    index1 = abreArquivo(nome1Arqu, "r");
    if (index1 == NULL)
    {
        printf("Erro de Arquivo");
        exit(1);
    }
    index2 = abreArquivo(nome2Arqu, "r");
    if (index2 == NULL)
    {
        printf("Erro de Arquivo");
        exit(1);
    }
    indexF = abreArquivo(nomeF, "w+");
    if (indexF == NULL)
    {
        printf("Erro de Arquivo");
        exit(1);
    }

    //varrendo os index
    while (!(tag1 == 1 && tag2 == 1))
    {
        //pegando termos do arquvi 1 
        if (control == 1 || control == 0)
        {
            tag1 = pegaString(reg1, prr1, index1, &greg1);
            if (tag1 == 1)
                strcpy(reg1, ultima);
        }
        
        if (control == 2 || control == 0)
        {
            tag2 = pegaString(reg2, prr2, index2, &greg2);
            if (tag2 == 1)
                strcpy(reg2, ultima);
        }

        //gravou tudo para
        if (tag1 == 1 && tag2 == 1)
            break;

        //fazendo o merge
        //cose iqual
        if (!strcmp(reg1, reg2))
        {
            fprintf(indexF, "%s;%s;1\n", reg1, prr1);
            control = 0;
            greg1 = 1;
            greg2 = 1;
        }
        else
        {
            //se nao iqual
            if (compara(reg1, reg2) < 0)
            {
                fprintf(indexF, "%s;%s;1\n", reg1, prr1);
                control = 1;
            }
            else
            {
                fprintf(indexF, "%s;%s;2\n", reg2, prr2);
                control = 2;
            }
        }
    }

    fclose(index1);
    fclose(index2);
    fclose(indexF);
}

int pegaString(char* registro, char* prr, FILE* index, int *valor)
{
    int i;
    if (feof(index))
        return 1;
    else
    {
        i = -1;
        do
        {
            i++;
            fscanf(index, "%c", &registro[i]);
            if (feof(index))
                return 1;
        }
        while (registro[i] != ';');
        registro[i] = '\0';

        i = -1;
        do
        {
            i++;
            fscanf(index, "%c", &prr[i]);
            if (feof(index))
                return 1;
        }
        while (prr[i] != '\n');
        prr[i] = '\0';
    }
    *valor = 0;
    return 0;
}

void geraArqu(char *nome1Arqu, char *nome2Arqu, char *nomeF)
{
    //variveis
    char reg[100], termo[100], lixo, exten[] = EXTENTAB;
    int prr, arqu;
    FILE *table1, *table2, *indexF, *tableF;

    //abrindos os arquivos
    removeExten(nome1Arqu);
    colocaExten(nome1Arqu, exten);
    table1 = abreArquivo(nome1Arqu, "r");
    if (table1 == NULL)
    {
        printf("Erro de Arquivo");
        exit(1);
    }

    removeExten(nome2Arqu);
    colocaExten(nome2Arqu, exten);
    table2 = abreArquivo(nome2Arqu, "r");
    if (table2 == NULL)
    {
        printf("Erro de Arquivo");
        exit(1);
    }

    indexF = abreArquivo(nomeF, "r");
    if (indexF == NULL)
    {
        printf("Erro de Arquivo");
        exit(1);
    }

    removeExten(nomeF);
    colocaExten(nomeF, exten);
    tableF = abreArquivo(nomeF, "w+");
    if (tableF == NULL)
    {
        printf("Erro de Arquivo");
        exit(1);
    }

    while (!feof(indexF))
    {
        fscanf(indexF, "%[^;]", termo);
        if (feof(indexF))
            break;

        fscanf(indexF, "%c", &lixo);
        fscanf(indexF, "%d", &prr);
        fscanf(indexF, "%c", &lixo);
        fscanf(indexF, "%d", &arqu);
        fscanf(indexF, "%c", &lixo);

        if (arqu == 1)
        {
            fseek(table1, prr, SEEK_SET);
            fscanf(table1, "%[^\n]", reg);
        }
        else
        {
            fseek(table2, prr, SEEK_SET);
            fscanf(table2, "%[^\n]", reg);
        }

        fprintf(tableF, "%s\n", reg);
    }
    fclose(table1);
    fclose(table2);
    fclose(indexF);
    fclose(tableF);

}
